Contents
Backpropagation (L8)
當我們在進行 Gradient descent 時,可能會需要對很多維的 vector 來進行偏微分,
而要如何有效率地做這件事?使用的就是 Backpropagation 。
(Gradient 也是個 vector)
待會會用到 Chain rule:
在進行 loss function 計算時,我們要把每筆 $y^n$ (output) 和 $\hat{y^n}$ (target) 的距離相加起來(前面是說用 cross entropy),
然後對其做偏微分
要把全部資料計算後的結果加總,這邊我們先只看一筆資料 Cost 的偏微分。
以一個 neuron 來看:
要算出某筆資料的 $\frac{\partial{C}}{\partial{W}}$ ,利用 Chain rule 分成兩項後,
分別會用到 Forward Pass 和 Backward Pass。
Forward Pass
很明顯可以看出來用 $w_n$ 做偏微分時,其結果就會是他的 input ($x_n$)。
所以要算出這個 Neural Network 中,每個 weight 對其 activation function 做偏微分的結果,
只要把 input 丟進去後,算出 每個 Neuron 的 output 即可。
一層一層下去後就會像是這樣向前傳遞:
Backward Pass
對第二項 $\frac{\partial{C}}{\partial{z}}$ 再做 Chain rule 分成兩項,
其中一項 $\frac{\partial{a}}{\partial{z}}$ ,$a$ 是 $z$ 代進 sigmoid function 後的結果,所以用 $z$ 對它作微分,就會是 sigmoid function 在 $z$ 的 導數。 ($\sigma^{\prime}(z)$)
接著下一項 $\frac{\partial{C}}{\partial{a}}$ 可以再用 chain rule 繼續分:
其中 $\frac{\partial{z^\prime}}{\partial{a}}$ 就等於其 weight ($w_3$),以此類推傳到下個 neuron 的就是 $w_4$。
而麻煩的是 $\frac{\partial{C}}{\partial{z^\prime}}$ ,在這邊我們假設已經知道它了。
式子統整就會像是:
其中 $\sigma^{\prime}(z)$ 在已經知道 $z$ 的情況下 是個常數。
Output Layer
假設現在下一層就是最後一層了($y_n$) ,我們可以把剛有困難的 $\frac{\partial{C}}{\partial{z^\prime}}$ 再次利用 chain rule ,就可以算出來了。
(這邊代號之間的關係,其實我已經搞不太清楚了…)
Not Output Layer
如果下一層不是 output layer ,就繼續往下一層看,直到 network 的 output 出來可以求出 $\frac{\partial{C}}{\partial{z_a}}$ 。
遞迴 的概念。
結論
本來我們從 $z_1$ 的偏微分開始算,需要知道 $z_2$ 的然後繼續往下直到 output layer。但這樣是沒有效率的。
所以我們如果 從後面做回來 ,也就是 $z_5,z_6$ 對 $C$ 偏微分開始算起,這樣接著就可以知道 $z_3,z_4$ 的。比較有效率。
(這邊的三角形符號是指 op-amp ,我已經不記得那是幹嘛的了…)
這個步驟就叫做 Backward Pass ,而實際上的做法就是再建一個反向的 neural network,而它的 activation function 要先算完 forward pass 才能知道。
這樣就能算出每個 $z$ 對 $C$ 的偏微分了。